import { NCAPIStructure } from "../../frame/native/NativeClient";

export type NCRequest<uri extends NCAPIURI> = NCAPIStructMap[uri]['request'];
export type NCResponse<uri extends NCAPIURI> = NCAPIStructMap[uri]['response'];
export type NCBody<uri extends NCAPIURI> = NCRequest<uri>['data'];
export type NCResult<uri extends NCAPIURI> = Awaited<NCResponse<uri>>['data'];

export enum NCAPIURI {
	/** 设备ID */
	DeviceID = 'device_id',
	/** 设置剪贴板 */
	SetClipboard = 'set_clipboard',
	/** 广告接口 */
	AD = 'AD',
	/** 本地化接口 */
	LOCAL = 'LocalLanguage',
	/** 浮层弹窗 */
	Float = 'float-pop',
	/** 评分弹窗 */
	ScorePop = 'ScorePop',
	/** 关闭加载中 */
	CloseLoading = 'closeLoading',
	/** 游戏内容切换 */
	GameType = 'type',
	/** 埋点上报接口 */
	Point = 'POINT',
}

interface NCAPIStructMap {
	[NCAPIURI.SetClipboard]: NCAPIStructure<{
		/** 要设置的文本 */
		text: string;
	},{}>;
	[NCAPIURI.AD]: NCAPIStructure<{
		/**
		 * 广告类型\
		 *  [incentive]: 激励广告\
		 *  [full-screen]: 全屏广告
		 */
		type: 'incentive'|'full-screen',
	},{
		/**
		 * 广告结束状态\
		 *  [ad-over]: 广告播放结束\
		 *  [ad-error]: 广告播放失败
		 */
		status: `ad-${'over'|'error'}`
	}>;
	[NCAPIURI.DeviceID]: NCAPIStructure<{},{
        /** 用户设备ID */
		device_id: string;
	}>;
	[NCAPIURI.LOCAL]: NCAPIStructure<{},{
		/**
		 * 国家码
		 *  https://q178jmgy9tl.feishu.cn/sheets/MaWdsru9ihFVVZtb7LCcGjy6nef
		 */
		countryCode: string;
		/** 语言码 */
		languageCode: string;
	}>;
	[NCAPIURI.Float]: NCAPIStructure<{}, {}>;
	[NCAPIURI.ScorePop]: NCAPIStructure<{}, {}>;
	[NCAPIURI.CloseLoading]: NCAPIStructure<{}, {}>;
	[NCAPIURI.Point]: NCAPIStructure<{
		/** 点位标识符 */
		point: string;
		/** 点位数据，格式化的字符串 */
		value: string;
	}, {}>;
	[NCAPIURI.GameType]: NCAPIStructure<{},{
		/**
		* 展示游戏类型
		*  [A]: A面纯游戏内容
		*  [B]: B面完整的商业化内容
		*/
		type: "A"|"B";
	}>;
}

export type NCPointData<point extends NCPoint> = NCPointStructMap[point];

export type NCUserPoint = {[point in keyof typeof NCPoint]: NCPointStructMap[typeof NCPoint[point]] extends {userId: number} ? point : never}[keyof typeof NCPoint];

/** 原生埋点标识符 */
export enum NCPoint {
	/** 进入关卡上报 */
	FruitLevel = 'fruitLevel',
	/** 闯关成功 */
	FruitLevelSuccess = 'fruitLevelSuccess',
	/** 闯关失败 */
	FruitLevelFail = 'fruitLevelFail',
	/** 发起打款 */
	FruitFree = 'fruitFree',
	/** 触发兜底 */
	ReachButtonLine = 'reachButtonLine',
	/** 点击宝箱 */
	ClickLuckyBox = 'clickLuckyBox',
	/** 领取宝箱 */
	GetLuckyBox = 'getLuckyBox',
	/** 领取合成奖励 */
	UserGetFruit = 'userGetFruit',
	/** 点击解锁 */
	WishAddSpace = 'wishAddSpace',
	/** 购买解锁成功 */
	GetAddSpace = 'getAddSpace',
	/** 打开商品页面（购买钻石） */
	WishGetDiamond = 'wishGetDiamond',
	/** 购买成功（商品1） */
	GetLevel2Success = 'getLevel2Success',
	/** 购买成功（商品2） */
	GetLevel3Success = 'getLevel3Success',
	/** 购买成功（商品3） */
	GetLevel4Success = 'getLevel4Success',
	/** cocos开始加载资源，整个app生命周期上报一次 */
	GameInitStart = 'gameInitStart',
	/** cocos加载资源完成，整个app生命周期上报一次 */
	GameInitFinish = 'gameInitFinish',
	/** 进入游戏，整个app生命周期上报一次 */
	GameStart = 'gameStart'
}

/** 原生埋点接口上报结构 */
interface NCPointStructMap {
	[NCPoint.FruitLevel]: {
		/** 关卡信息 */
		fruitLevel: number;
		/** 用户ID */
		userId: number;
	};
	[NCPoint.FruitLevelSuccess]: {
		/** 关卡信息 */
		fruitLevel: number;
		/** 用户ID */
		userId: number;
	};
	[NCPoint.FruitLevelFail]: {
		/** 关卡信息 */
		fruitLevel: number;
		/** 用户ID */
		userId: number;
	};
	[NCPoint.FruitFree]: {
		/** 关卡信息 */
		fruitLevel: number;
		/** 用户ID */
		userId: number;
	};
	[NCPoint.ReachButtonLine]: {
		/** 用户ID */
		userId: number;
	};
	[NCPoint.ClickLuckyBox]: {
		/** 用户ID */
		userId: number;
	};
	[NCPoint.GetLuckyBox]: {
		/** 用户ID */
		userId: number;
	};
	[NCPoint.UserGetFruit]: {
		/** 用户ID */
		userId: number;
	};
	[NCPoint.WishAddSpace]: {
		/** 用户ID */
		userId: number;
	};
	[NCPoint.GetAddSpace]: {
		/** 用户ID */
		userId: number;
		/** 交易金额 */
		replace: number;
	};
	[NCPoint.WishGetDiamond]: {
		/** 用户ID */
		userId: number;
	};
	[NCPoint.GetLevel2Success]: {
		/** 用户ID */
		userId: number;
		/** 交易金额 */
		replace: number;
	};
	[NCPoint.GetLevel3Success]: {
		/** 用户ID */
		userId: number;
		/** 交易金额 */
		replace: number;
	};
	[NCPoint.GetLevel4Success]: {
		/** 用户ID */
		userId: number;
		/** 交易金额 */
		replace: number;
	};
	[NCPoint.GameInitStart]: {
		/** 用户ID */
		userId: number;
	}
	[NCPoint.GameInitFinish]: {
		/** 用户ID */
		userId: number;
	}
	[NCPoint.GameStart]: {
		/** 用户ID */
		userId: number;
	}
}
